import java.util.HashMap;
import java.util.Map;
// 力扣290. 单词规律
class Solution {
    public boolean wordPattern(String pattern, String s) {
        String[] s2 = s.split(" ");
        char[] c1 = pattern.toCharArray();
        if (s2.length != pattern.length()) {
            return false;
        }

        int[] hash1 = new int[26];
        Map<String, Integer> hash2 = new HashMap<>();
        for (int i = 0; i < c1.length; i++) {
            char c = c1[i];
            String s3 = s2[i];
            int index1 = hash1[c - 'a'];
            if (index1 != 0) {
                if(!hash2.containsKey(s3)){ // hash1存在，hash2不存在
                    return false;
                }
                if(!hash2.get(s3).equals(index1)){ // 两个都存在，但是位置不同
                    return false;
                }
            } else {
                if (hash2.containsKey(s3)) { // hash1不存在,hash2存在
                    return false;
                }
                hash1[c - 'a'] = i+1; // 设为i+1，避免与0冲突
                hash2.put(s3, i+1);
            }
        }
        return true;
    }
}


// 力扣242. 有效的字母异位词
class Solution1 {
    public boolean isAnagram(String s, String t) {
        int n = s.length();
        int m = t.length();
        if(n!=m){
            return false;
        }
        int[] hash = new int[128];
        for(int i=0;i<n;i++){
            char c = s.charAt(i);
            hash[c-'a']++;
        }
        for(int i=0;i<m;i++){
            char c = t.charAt(i);
            hash[c-'a']--;
        }
        for(int i=0;i<n;i++){
            char c = t.charAt(i);
            if(hash[c-'a']!=0){
                return false;
            }
        }
        return true;
    }
}

// 力扣219. 存在重复元素 II
class Solution2 {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer,Integer> map = new  HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                if(i-map.get(nums[i])<=k){
                    return true;
                }
            }
            map.put(nums[i],i);
        }
        return false;
    }
}